/**
 * @file errno.h
 * @copyright Copyright (C) 2015-2018 Alibaba Group Holding Limited
 */

#ifndef AOS_ERRNO_H
#define AOS_ERRNO_H

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @addtogroup aos_errno errno
 * Define standard errno.
 *
 * @{
 */

#if defined(__GNUC__)&&!defined(__CC_ARM)||defined(_WIN32)

#include <errno.h>

#else
/* Define standard errno for __CC_ARM and __ICCARM__ */
#define  EPERM         1  /**< Operation not permitted */
#define  ENOENT        2  /**< No such file or directory */
#define  ESRCH         3  /**< No such process */
#define  EINTR         4  /**< Interrupted system call */
#define  EIO           5  /**< I/O error */
#define  ENXIO         6  /**< No such device or address */
#define  E2BIG         7  /**< Arg list too long */
#define  ENOEXEC       8  /**< Exec format error */
#define  EBADF         9  /**< Bad file number */
#define  ECHILD       10  /**< No child processes */
#define  EAGAIN       11  /**< Try again */

#ifdef   ENOMEM
#undef   ENOMEM
#endif

#define  ENOMEM       12  /**< Out of memory */
#define  EACCES       13  /**< Permission denied */
#define  EFAULT       14  /**< Bad address */
#define  ENOTBLK      15  /**< Block device required */
#define  EBUSY        16  /**< Device or resource busy */
#define  EEXIST       17  /**< File exists */
#define  EXDEV        18  /**< Cross-device link */
#define  ENODEV       19  /**< No such device */
#define  ENOTDIR      20  /**< Not a directory */
#define  EISDIR       21  /**< Is a directory */

#ifdef   EINVAL
#undef   EINVAL
#endif

#define  EINVAL       22  /**< Invalid argument */
#define  ENFILE       23  /**< File table overflow */
#define  EMFILE       24  /**< Too many open files */
#define  ENOTTY       25  /**< Not a typewriter */
#define  ETXTBSY      26  /**< Text file busy */
#define  EFBIG        27  /**< File too large */
#define  ENOSPC       28  /**< No space left on device */
#define  ESPIPE       29  /**< Illegal seek */
#define  EROFS        30  /**< Read-only file system */
#define  EMLINK       31  /**< Too many links */
#define  EPIPE        32  /**< Broken pipe */

#ifdef   EDOM
#undef   EDOM
#define  EDOM         33  /**< Math argument out of domain of func */
#endif

#ifdef   ERANGE
#undef   ERANGE
#define  ERANGE       34  /**< Math result not representable */
#endif

#define  EDEADLK      35  /**< Resource deadlock would occur */
#define  ENAMETOOLONG 36  /**< File name too long */
#define  ENOLCK       37  /**< No record locks available */
#define  ENOSYS       38  /**< Function not implemented */
#define  ENOTEMPTY    39  /**< Directory not empty */
#define  ELOOP        40  /**< Too many symbolic links encountered */
#define  EWOULDBLOCK  EAGAIN  /**< Operation would block */
#define  ENOMSG       42  /**< No message of desired type */
#define  EIDRM        43  /**< Identifier removed */
#define  ECHRNG       44  /**< Channel number out of range */
#define  EL2NSYNC     45  /**<* Level 2 not synchronized */
#define  EL3HLT       46  /**< Level 3 halted */
#define  EL3RST       47  /**< Level 3 reset */
#define  ELNRNG       48  /**< Link number out of range */
#define  EUNATCH      49  /**< Protocol driver not attached */
#define  ENOCSI       50  /* No CSI structure available */
#define  EL2HLT       51  /**< Level 2 halted */
#define  EBADE        52  /**< Invalid exchange */
#define  EBADR        53  /**< Invalid request descriptor */
#define  EXFULL       54  /**< Exchange full */
#define  ENOANO       55  /**< No anode */
#define  EBADRQC      56  /**< Invalid request code */
#define  EBADSLT      57  /**< Invalid slot */

#define  EDEADLOCK    EDEADLK

#define  EBFONT       59  /**< Bad font file format */
#define  ENOSTR       60  /**< Device not a stream */
#define  ENODATA      61  /**< No data available */
#define  ETIME        62  /**< Timer expired */
#define  ENOSR        63  /**< Out of streams resources */
#define  ENONET       64  /**< Machine is not on the network */
#define  ENOPKG       65  /**< Package not installed */
#define  EREMOTE      66  /**< Object is remote */
#define  ENOLINK      67  /**< Link has been severed */
#define  EADV         68  /**< Advertise error */
#define  ESRMNT       69  /**< Srmount error */
#define  ECOMM        70  /**< Communication error on send */
#define  EPROTO       71  /**< Protocol error */
#define  EMULTIHOP    72  /**< Multihop attempted */
#define  EDOTDOT      73  /**< RFS specific error */
#define  EBADMSG      74  /**< Not a data message */
#define  EOVERFLOW    75  /**< Value too large for defined data type */
#define  ENOTUNIQ     76  /**< Name not unique on network */
#define  EBADFD       77  /**< File descriptor in bad state */
#define  EREMCHG      78  /**< Remote address changed */
#define  ELIBACC      79  /**< Can not access a needed shared library */
#define  ELIBBAD      80  /**< Accessing a corrupted shared library */
#define  ELIBSCN      81  /**< .lib section in a.out corrupted */
#define  ELIBMAX      82  /**< Attempting to link in too many shared libraries */
#define  ELIBEXEC     83  /**< Cannot exec a shared library directly */

#ifdef   EILSEQ
#undef   EILSEQ
#endif

#define  EILSEQ       84  /**< Illegal byte sequence */
#define  ERESTART     85  /**< Interrupted system call should be restarted */
#define  ESTRPIPE     86  /**< Streams pipe error */
#define  EUSERS       87  /**< Too many users */
#define  ENOTSOCK     88  /**< Socket operation on non-socket */
#define  EDESTADDRREQ 89  /**< Destination address required */
#define  EMSGSIZE     90  /**< Message too long */
#define  EPROTOTYPE   91  /**< Protocol wrong type for socket */
#define  ENOPROTOOPT  92  /**< Protocol not available */
#define  EPROTONOSUPPORT 93  /**< Protocol not supported */
#define  ESOCKTNOSUPPORT 94  /**< Socket type not supported */
#define  EOPNOTSUPP      95  /**< Operation not supported on transport endpoint */
#define  EPFNOSUPPORT    96  /**< Protocol family not supported */
#define  EAFNOSUPPORT    97  /**< Address family not supported by protocol */
#define  EADDRINUSE      98  /**< Address already in use */
#define  EADDRNOTAVAIL   99  /**< Cannot assign requested address */
#define  ENETDOWN       100  /**< Network is down */
#define  ENETUNREACH    101  /**< Network is unreachable */
#define  ENETRESET      102  /**< Network dropped connection because of reset */
#define  ECONNABORTED   103  /**< Software caused connection abort */
#define  ECONNRESET     104  /**< Connection reset by peer */
#define  ENOBUFS        105  /**<* No buffer space available */
#define  EISCONN        106  /**< Transport endpoint is already connected */
#define  ENOTCONN       107  /**< Transport endpoint is not connected */
#define  ESHUTDOWN      108  /**< Cannot send after transport endpoint shutdown */
#define  ETOOMANYREFS   109  /**< Too many references: cannot splice */
#define  ETIMEDOUT      110  /**< Connection timed out */
#define  ECONNREFUSED   111  /**< Connection refused */
#define  EHOSTDOWN      112  /**< Host is down */
#define  EHOSTUNREACH   113  /**< No route to host */
#define  EALREADY       114  /**< Operation already in progress */
#define  EINPROGRESS    115  /**< Operation now in progress */
#define  ESTALE         116  /**< Stale NFS file handle */
#define  EUCLEAN        117  /**< Structure needs cleaning */
#define  ENOTNAM        118  /**< Not a XENIX named type file */
#define  ENAVAIL        119  /**< No XENIX semaphores available */
#define  EISNAM         120  /**< Is a named type file */
#define  EREMOTEIO      121  /**< Remote I/O error */
#define  EDQUOT         122  /**< Quota exceeded */

#define  ENOMEDIUM      123  /**< No medium found */
#define  EMEDIUMTYPE    124  /**< Wrong medium type */


#define ENSROK                    0 /**< DNS server returned answer with no data */
#define ENSRNODATA              160 /**< DNS server returned answer with no data */
#define ENSRFORMERR             161 /**< DNS server claims query was misformatted */
#define ENSRSERVFAIL            162 /**< DNS server returned general failure */
#define ENSRNOTFOUND            163 /**< Domain name not found */
#define ENSRNOTIMP              164 /**< DNS server does not implement requested operation */
#define ENSRREFUSED             165 /**< DNS server refused query */
#define ENSRBADQUERY            166 /**< Misformatted DNS query */
#define ENSRBADNAME             167 /**< Misformatted domain name */
#define ENSRBADFAMILY           168 /**< Unsupported address family */
#define ENSRBADRESP             169 /**< Misformatted DNS reply */
#define ENSRCONNREFUSED         170 /**< Could not contact DNS servers */
#define ENSRTIMEOUT             171 /**< Timeout while contacting DNS servers */
#define ENSROF                  172 /**< End of file */
#define ENSRFILE                173 /**< Error reading file */
#define ENSRNOMEM               174 /**< Out of memory */
#define ENSRDESTRUCTION         175 /**< Application terminated lookup */
#define ENSRQUERYDOMAINTOOLONG  176 /**< Domain name is too long */
#define ENSRCNAMELOOP           177 /**< Domain name is too long */

#endif /* defined(__GNUC__)&&!defined(__CC_ARM)||defined(_WIN32) */

/**
 * Redefine the errno, Only use in framework/app
 */
#ifdef BUILD_BIN

#undef set_errno
#define set_errno(err) do { if (err) { errno = (err); } } while(0)

#else /* BUILD_BIN */

#ifdef BUILD_APP
/**
 * Get system errno.
 *
 * @return  int: return system errno for app bin.
 */
extern int  get_errno(void);
/**
 * Set system errno.
 *
 * @param[in]  err       err to set into system.
 *
 * @return  none.
 */
extern void set_errno(int err);

#undef errno
#define errno get_errno()   /* Get system errno, unique copy for system */

#endif /* BUILD_APP */

#endif /* BUILD_BIN */

/** @} */

#ifdef __cplusplus
}
#endif

#endif /* AOS_ERRNO_H */

